<?php
/**
 * @прототип PassValidator
 * 
 * [пример использования]  
    
     $pass = 'asZ12';
     
   
      //
      $validatorChain = new Zend\Validator\ValidatorChain();
      
      $validatorChain->addValidator(new Zend\Validator\NotEmpty() )
                      ->addValidator(new Zend\Validator\StringLength(array('min' => 6, 'max' => 12)))
                     
                    ->addValidator( new PassValidator());
 
        //
        if ($validatorChain->isValid($pass)) {
            // pass passed validation
        } else {
            // pass failed validation; print reasons
            foreach ($validatorChain->getMessages() as $message) {
                fb( "$message\n" );
            }
        }
 
 */
class PassValidator extends Zend\Validator\AbstractValidator {
        
        const LENGTH = 'length';
        const UPPER  = 'upper';
        const LOWER  = 'lower';
        const DIGIT  = 'digit';
        const MSG_MINIMUM  = 'msgMinimum';
        const NOT_EQUAL  = 'is_equal';

        // пароль
        // был длиной как минимум 8 символов,
        // содержал как минимум одну букву в верхнем регистре
        // содержал как минимум одну букву в нижнем регистре
        // содержал как минимум один цифровой символ.
        
        public $minimum = 0;
        
        protected $messageVariables = array(
            'min' => 'minimum'
        );
        protected $options;
        protected $length_limit = 5;

        protected $messageTemplates = array(
            self::LENGTH => "'%value%' должен быть длиной как 5 минимум символов",
            self::UPPER  => "'%value%' должен содержать как минимум одну букву в верхнем регистре",
            self::LOWER  => "'%value%' должен содержать как минимум одну букву в нижнем регистре",
            self::DIGIT  => "'%value%' должен содержать как минимум один цифровой символ",
            self::MSG_MINIMUM => "'%value%' must be at least '%min%'",
            self::NOT_EQUAL => "пароли не совпадают",
        );
        
        function __construct($options = array()){

            $this->options = $options;

            if(isset($options['length_limit'])) $this->length_limit = $options['length_limit'];

            $this->messageTemplates[self::LENGTH] = "'%value%' должен быть длиной как {$this->length_limit} минимум символов";

            parent::__construct(); 
        }
        
        
        /**
        * @назначение: проверяет валидность данных по независимым критериям
        * @params    : строка
        * @return    : true/false
        */
        function isValid($value){
            $this->setValue($value);
 
        $isValid = true;
 
        if (strlen($value) < $this->length_limit) {
            $this->error(self::LENGTH);
            $isValid = false;
        }
 
        if (!preg_match('/[A-Z]/', $value)) { 
            $this->error(self::UPPER);
            $isValid = false;
        }
 
        if (!preg_match('/[a-z]/', $value)) {  
            $this->error(self::LOWER); 
            $isValid = false;
        }
 
        if (!preg_match('/\d/', $value)) { 
            $this->error(self::DIGIT);
            $isValid = false;
        }

        if(isset($this->options['password']) AND isset($this->options['password_2'])){
            if($this->options['password'] != $this->options['password_2']){
                $this->error(self::NOT_EQUAL);
                $isValid = false;
            }
        }
  
        $messages = $this->getMessages();
 
        return $isValid;
        }
    }